package com.mvc.controller;

import hbm.DetallePedido;
import hbm.DetallePedidoDAO;
import hbm.Empleados;
import hbm.EmpleadosDAO;
import hbm.Inventario;
import hbm.InventarioDAO;

import hbm.Mercaderia;
import hbm.MercaderiaDAO;
import hbm.Pedidos;
import hbm.PedidosDAO;

import hbm.Sucursal;
import hbm.SucursalDAO;

import java.io.IOException;

import java.util.ArrayList;

import java.util.Iterator;
import java.util.List;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;


import dot.WrapperDetallePedido;
import dot.WrapperInventario;

public class InventarioController extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * The doGet method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	@SuppressWarnings({ "unchecked" })
	public void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		String opcion = request.getParameter("opcion");
		if (opcion != null && opcion.equals("inventario")) {
			String boton = request.getParameter("boton");
			if (boton != null && boton.equals("DarAlta")) {
	
				List <DetallePedido> listaDetallePorPedidos = (List<DetallePedido>) request.getSession().getAttribute("listadoDetallesPorPedido");
				Iterator iterador = listaDetallePorPedidos.iterator();
				
				Integer idSucursal = (Integer.parseInt(request.getParameter("idSucursal")));
				while(iterador.hasNext()){
					DetallePedido detalle = (DetallePedido) iterador.next();
					int idMercaderia = detalle.getMercaderia().getId();
					
					Session session1 = new InventarioDAO().getSession();

					Pedidos pedidoAsociado = new PedidosDAO().findById(detalle.getPedidos().getId());
					
					Query query = session1.createQuery("from Inventario where mercaderia.id=:idMercaderia");
					query.setParameter("idMercaderia", idMercaderia);
					List listaInventario = query.list();
					
					Inventario inventario = new Inventario();
						
					if (listaInventario.size()>0){
						inventario=(Inventario) listaInventario.get(0);
					}
					
					if (inventario.getId()==0){
						inventario = new Inventario();
						inventario.setCantidad(detalle.getCantidad());
						inventario.setMercaderia(new MercaderiaDAO().findById(idMercaderia));
						inventario.setSucursal(new SucursalDAO().findById(idSucursal));
					}else{
						int cantidadStock = inventario.getCantidad();
						int nuevoStock = (cantidadStock+detalle.getCantidad());
						inventario.setCantidad(nuevoStock);
					}
					
					pedidoAsociado.setEstado(false);
					Session session2 = new PedidosDAO().getSession();
					Session session = new InventarioDAO().getSession();
						Transaction tx = session.beginTransaction();
						//Transaction tx1 = session2.beginTransaction();
						new InventarioDAO().save(inventario);
						try {
							session.saveOrUpdate(inventario);
							session2.saveOrUpdate(pedidoAsociado);
							if (!tx.wasCommitted())
							tx.commit();
							session.close();
							//session2.close();

						} catch (HibernateException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
							
						}
						
				}
				
			}
			response.sendRedirect("./jsp/listadoInventarios.jsp");
			
		}
				
				if (opcion != null && opcion.equals("filtrar")) {
					Integer idPedido = Integer.parseInt(request
							.getParameter("idPedido"));
					String codigoEmpleado = request.getParameter("idEmpleado");
					Pedidos pedidoSeleccionada = new PedidosDAO()
							.findById(idPedido);
					request.getSession().setAttribute("idPedidoSeleccionado",
							pedidoSeleccionada.getId());
					request.getSession().setAttribute("fechaPedidoSeleccionada",
							pedidoSeleccionada.getFechaPedido());
					request.getSession().setAttribute("proveedorPedidoSeleccionada",
							pedidoSeleccionada.getProveedor().getNombre());
					request.getSession().setAttribute("sucursalPedidoSeleccionada",
							pedidoSeleccionada.getSucursal().getId());
					request.getSession().setAttribute("nombreSucursalSeleccionada",
					pedidoSeleccionada.getSucursal().getNombre());
					request.getSession().setAttribute("codigoEmpleadoValidado",
							codigoEmpleado);


					List<DetallePedido> listaDetalles = new DetallePedidoDAO().findAll();

					Iterator itr = listaDetalles.listIterator();
					List<DetallePedido> listaDetallesPorPedido = new ArrayList<DetallePedido>();

					if (listaDetalles.size() != 0) {
						while (itr.hasNext()) {
							DetallePedido dp = (DetallePedido) itr.next();
							if (dp.getPedidos().getId() == idPedido) {
								listaDetallesPorPedido.add(dp);
							}

						}
					}

					request.getSession().setAttribute("listadoDetallesPorPedido",
							listaDetallesPorPedido);

					response.sendRedirect("./jsp/ingresoStock.jsp");

				}
				
				if (opcion != null && opcion.equals("listarPedidos")) {

					String codigoEmpleado = request.getParameter("txtcodigoempleado");
					
					List <Empleados> listaEmpleados = new EmpleadosDAO().findAll();
					Iterator itdr = listaEmpleados.listIterator();
					while (itdr.hasNext()){
						Empleados e = (Empleados)itdr.next();
						if (e.getCodigo().equals(codigoEmpleado)){
							
							request.getSession().setAttribute("idEmpleado", e.getCodigo());
							request.getSession().setAttribute("idSucursal", e.getSucursal().getId());
							
							Empleados empleado = new EmpleadosDAO().findById(e.getId());
							List<Pedidos> listaPedido = new PedidosDAO().findAll();

							Iterator itr = listaPedido.listIterator();
							List<Pedidos> listaPedidosPorSucursal = new ArrayList<Pedidos>();

							if (listaPedido.size() != 0) {
								while (itr.hasNext()) {
									Pedidos p = (Pedidos) itr.next();
									if ((p.getSucursal().getId() == empleado.getSucursal().getId())&& p.getEstado()==true) {
										listaPedidosPorSucursal.add(p);
									}

								}
							}
							
							
							
							request.getSession().setAttribute("listadoPedidos",listaPedidosPorSucursal);
							response.sendRedirect("./jsp/seleccionPedido.jsp");
							break;
						}else{
							response.sendRedirect("./jsp/validarEmpleadoInvErr.jsp");
							break;
						}
					}
					
					

				}
				
				if (opcion!=null && opcion.equals("validarEmpleado")){
					response.sendRedirect("./jsp/validarEmpleadoInv.jsp");
				}
				
				if (opcion != null && opcion.equals("listar")) {
					List <Inventario> listaInventario = new InventarioDAO().findAll();
					request.getSession().setAttribute("listaInventario", listaInventario);
					response.sendRedirect("./jsp/listadoInventarios.jsp");
				}
				
				
			}
		
	
}
